(C) 1996 AROS - The Amiga Replacement OS


NAME
LONG SPSqrt()
SYNOPSIS

LONG fnum1

LOCATION
In MathTransBase at offset 16
FUNCTION
Calculate square root of ffp number

INPUTS
fnum1 - Motorola fast floating point number
RESULT
Motorola fast floating point number

flags: zero : result is zero negative : 0 overflow : square root could not be calculated

NOTES
EXAMPLE
BUGS
SEE ALSO
INTERNALS

ALGORITHM: First check for a zero and a negative argument and take appropriate action. fnum1 = M * 2^E

If exponent is an odd number: fnum = ( M*2 ) * 2^ (E-1) Now E' = E-1 is an even number and -> sqrt(fnum) = sqrt(M) * sqrt(2) * sqrt (2^E') = sqrt(M) * sqrt(2) * 2^(E'/2) (with sqrt(M*2)>1) = sqrt(M) * sqrt(2) * 2^(E'/2) = sqrt(M) * 1/sqrt(2) * 2^(1+(E'/2)) = sqrt(M/2) * 2^(1+(E'/2))

If Exponent is an even number: -> sqrt(fnum) = sqrt(M) * sqrt (2^E) = = sqrt(M) * 2^(E/2)

Now calculate the square root of the mantisse. The following algorithm calculates the square of a number + delta and compares it to the mantisse. If the square of that number + delta is less than the mantisse then keep that number + delta. Otherwise calculate a lower delta and try again. Start out with number = 0;

Exponent = -1; Root = 0; repeat { if ( ( Root + 2^Exponent ) ^2 < Mantisse) Root += 2^Exponent Exponent --; } until you`re happy with the accuracy

HISTORY
21.07.1997 bergers
*** empty log message ***